package 字符串;

/**
 * 125 验证回文串
 *
 * 如果在将所有大写字符转换为小写字符、并移除所有非字母数字字符之后，短语正着读和反着读都一样。则可以认为该短语是一个 回文串 。
    字母和数字都属于字母数字字符。
    给你一个字符串 s，如果它是 回文串 ，返回 true ；否则，返回 false 。

    思路：
    1： 将字符串使用库函数转换为小写
    2： 字符串s去除非字母的部分
    3： 使用双指针遍历即可
 */
public class L_125 {
    public boolean isPalindrome(String s) {
         // 将字符串转换为小写
        s = s.toLowerCase();

        // 使用 StringBuilder 来构建一个只包含字母数字字符的新字符串
        StringBuilder filtered = new StringBuilder();

        // 遍历字符串，只保留字母和数字字符
        for (char c : s.toCharArray()) {
            if (Character.isLetterOrDigit(c)) {
                filtered.append(c);
            }
        }
         // 获取过滤后的字符串
        String filteredStr = filtered.toString();

        // 获取过滤后字符串的长度
        int len = filteredStr.length();

        // 使用双指针法检查是否是回文串
        int left = 0;
        int right = len - 1;

        while (left < right) {
            if (filteredStr.charAt(left) != filteredStr.charAt(right)) {
                return false; // 如果左右指针所指的字符不相同，则不是回文串
            }
            left++;
            right--;
        }

        return true;
    }
}
